<?php 
/**
 * Класс загрузчик приложения
 * 
 * The Zend_Application_Bootstrap_BootstrapAbstract implementation provides a simple convention
 * for defining class resource methods. Any protected method beginning with a name prefixed with
 * _init will be considered a resource method.
 * 
 * LICENSE: Free to use license
 * 
 * @copyright 	2009
 * @author 		Яковлев Иван Yak1980@list.ru | Best4u.mail@gmail.com
 * @version		$id:$
 * @link 
 * @since 
 */
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
   /**
    * Контейнер для хранения конфигурации приложения
    */
    private $_config = null; 

    
    /**
     * Инициализируем сессию для приложения
     */	
    protected function _initSession()
    {
    	$session = new Zend_Session_Namespace('siteSession');
    	return $session;
    }
    

	/**
	 * Заносим в реестр нашего приложения путь к корневой папке
	 * C:\server\htdocs\project-template 
	 */
	protected function _initRootDir()
	{
        Zend_Registry::set('rootDir', BASE_PATH);	
	}
	
	
	/**
     * Устанавливаем автозагрузчик (не используется).
     * 
     * В данный момент эта функция не используется т.к. ее действие полностью заменяет
     * свего одна строчка в конфигурационном файле application.ini:
     * 
     *     autoloaderNamespaces.system = "System_"
     * 
     */
	protected function _initAutoloader()
	{
        // Данные настройки заданы в application.ini
	    //$autoloader = Zend_Loader_Autoloader::getInstance();
        // регистрируем пространство имен для своих классов 
        //$autoloader->registerNamespace('System_');
        
        // Если вы не знаете какие пространства имен вы используете
        // или если вы используете компоненты других библиотек как PEAR,
        // которые не имеют определенных префиксов пространств имен,
        // вы можете включить функцию работы автозагрузкика классов
        // в режиме обратной совместимости, т.е. он будет работать 
        // как в старых версиях ZendFramework ниже 1.8:
        //     
        // ЗАМЕЧАНИЕ:
        //     Начиная с версии Zend Framework 1.8.1 данный параметр по умолчанию
        //     стоит в значение true и поэтому необходимость в этой строчке кода отпадает.
        //
        //$autoloader->setFallbackAutoloader(true);
	}

	
	/**
	 * Устанавливаем автозагрузчик классов для общих компонентов приложения
	 */
    protected function _initModuleAutoloader()
	{
	    $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath' => APPLICATION_PATH
        ));
        return $autoloader;
	}
	
	
	/**
     * Устанавливаем автозагрузчик классов для модуля defaults.
     */
	protected function _initDefaultModuleAutoloader()
	{
	    // This will autoload to models, filters, helpers, etc... for our default module.
	    // Эта функция позволит автоматически загружать необходимые классы из каталогов
	    // models, filters, helpers и т.д. нашего модуля defaults
	    $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'App',
            'basePath' => APPLICATION_PATH . '/modules/default'
        ));
        return $autoloader;
	}
	
	
	/**
     * Устанавливаем автозагрузчик классов для модуля администрирования.
     */
	protected function _initAdminModuleAutoloader()
	{
	    // This will autoload to models, filters, helpers, etc... for our admin module.
	    // Эта функция позволит автоматически загружать необходимые классы из каталогов
	    // models, filters, helpers и т.д. нашего модуля admin
	    $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Admin',
            'basePath' => APPLICATION_PATH . '/modules/admin'
        ));
        return $autoloader;
	}
	
	
	/**
	 * Устанавливаем автозагрузчик классов для модуля ajax.
	 */
	protected function _initAjaxModuleAutoloader()
	{
	    $autoloader = new Zend_Application_Module_Autoloader(array(
	        'namespace' => 'Ajax',
	        'basePath' => APPLICATION_PATH . '/modules/ajax'
	    ));
	    return $autoloader;
	}
	
	
	/**
	 * Настраиваем автозагрузку помощников действий
	 */
	protected function _initActionHelpersAutoloader()
	{
        Zend_Controller_Action_HelperBroker::addPrefix('System_Helper');
	}
	
	
	/**
	 * Включаем объект $config в реестр, чтобы обеспечить доступ к нему из всего приложения:
	 */
	protected  function _initConfig()
	{
	    $this->_config = new Zend_Config_Ini('application/configs/application.ini', APPLICATION_ENV);
	    Zend_Registry::set('config', $this->_config);
	}
	
	
	/**
	 * Задаем настройки подключения к базе данных
	 */
	protected function _initDataBase()
	{
    	// задаем параметры подключения к базе данных
    	$params = array(
    		'host' 				=> $this->_config->database->hostname,
    		'username' 			=> $this->_config->database->username,
    		'password'			=> $this->_config->database->password,
    		'dbname'			=> $this->_config->database->database,
    	);
    	
    	// Создание экземпляра класса адаптера не приведет к немедленному соединению с сервером СУРБД. 
    	// Адаптер сохраняет параметры соединения и производит подключение, когда нужно произвести первый  
    	// запрос к БД. Это значит, что само по себе создание объекта адаптера производится быстро и  
    	// занимает мало ресурсов. Вы можете создавать экземпляр адаптера даже в том случае, 
    	// если не уверены в том, что текущий запрос к вашему приложению требует каких-либо действий с БД:
    	$db = Zend_Db::factory($this->_config->database->type, $params);
    	
    	// Начиная с версии MySQL 5.0 при создании соединения с базой данных
    	// необходимо явно указать кодировку передаваемых данных для соединения
    	if (Zend_Registry::get('config')->charset == 'utf-8') 
    	    $db->query("SET NAMES 'utf8'");
    	else $db->query("SET NAMES 'cp1251'");

    	Zend_Db_Table_Abstract::setDefaultAdapter($db); // задаем адаптер подключения по-умолчанию
    	
    	// создаем профайлер для работы с запросами к БД
    	$profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
    	(APPLICATION_ENV == 'development')?
    	    $profiler->setEnabled(true) : $profiler->setEnabled(false);
    	$db->setProfiler($profiler);
    	
    	Zend_Registry::set('db', $db); // заносим экземпляр адаптера БД в реестр
    	
    	// Если нужно принудительно создать соединение с СУРБД, то используйте метод getConnection(). 
    	// Этот метод возвращает объект соединения в представлении соответствующего 
    	// расширения PHP для баз данных:
    	//$db->getConnection();
	}
	
	
	/**
	 * Создаем систему ведения лога приложения
	 */
	protected function _initLogger()
	{
    	// 1 вариант: создаем систему ведения лога нашего приложения (способ с использованием записи в лог-файл)
    	$debugLogger = new Zend_Log(new Zend_Log_Writer_Stream($this->_config->logger->path->debug));
    	$logLogger = new Zend_Log(new Zend_Log_Writer_Stream($this->_config->logger->path->log));
    	$loginErrorsLogger = new Zend_Log(new Zend_Log_Writer_Stream($this->_config->logger->path->loginerrors));
    	$appErrorsLogger = new Zend_Log(new Zend_Log_Writer_Stream($this->_config->logger->path->errors));
    	$formErrorsLogger = new Zend_Log(new Zend_Log_Writer_Stream($this->_config->logger->path->formerrors));
    	
    	// 2 вариант: создаем систему ведения лога нашего приложения (способ с использованием записи в лог-файл)
    	//			  данный способ доступен начиная с версии Zend Framework 1.6 (выводит сообщение в FireBug)
    	$loggerFireBug = new Zend_Log();
    	$writer = new Zend_Log_Writer_Firebug();
    	(APPLICATION_ENV == 'development')? $writer->setEnabled(true) : $writer->setEnabled(false);
    	$loggerFireBug->addWriter($writer);
    	
    	Zend_Registry::set('loggerFireBug', $loggerFireBug); // заносим в реестр приложения loggerFireBug
    	Zend_Registry::set('logLogger', $logLogger); // заносим в реестр приложения debugLogger
    	Zend_Registry::set('debugLogger', $debugLogger); // заносим в реестр приложения debugLogger
    	Zend_Registry::set('loginErrorsLogger', $loginErrorsLogger); // заносим в реестр приложения appErrorsLogger
    	Zend_Registry::set('appErrorsLogger', $appErrorsLogger); // заносим в реестр логер ошибок приложения
    	Zend_Registry::set('formErrorsLogger', $formErrorsLogger); // заносим в реестр логер ошибок заполнения формы
	}
	
	
	/**
	 * Инициализируем переводчик для приложения
	 */
	protected function _initTranslate() {
        $translate = new Zend_Translate('array', APPLICATION_PATH . '/languages/ru.php', 'ru');
        Zend_Registry::set('translation', $translate);
        return $translate;
	}
	
	
	/**
	 * Задаем глобальную переменную вида
	 * и регистрируем функц-ть библиотеки jQuery в объекте вида для дальнейшего использования
	 */
    protected function _initView()
    {
        $view = new Zend_View();
  	    
    	// Подключаем систему контроля доступа - Acl
    	$view->acl = new System_Acl();
    	
    	// Задаем шаблон для оформления сайта
    	$view->layout = Zend_Registry::get('config')->resources->layout->layout;
    	
        // Задаем DOCTYPE для сайта
        // (en) Note that DOCTYPE is used by some of the helpers - headStylesheet and headScript,
        //      in particular - to determine escaping.
        //
    	$view->doctype('XHTML1_TRANSITIONAL');
    	
    	// задаем пути к общим для всего приложения помощникам вида
    	$view->addHelperPath(APPLICATION_PATH . '/views/helpers');
    	
    	// Задаем основной заголовок и разделитель для заголовков
    	$view->headTitle()
    	     ->setSeparator(' - ')
    	     ->append(Zend_Registry::get('config')->project->name);

    	$view->charset = $this->_config->charset; // кодировка по умолчанию
    	$view->cacheVer = '?ver=' . $this->_config->cachecontrol; // контроль за кешированием css и js     
    	
//    	Zend_Dojo::enableView($view); // равносильно $view->addHelperPath('Zend/Dojo/View/Helper/', 'Zend_Dojo_View_Helper');
//    	//TODO надо будет разобраться с работой компонента jQuery
//    	ZendX_JQuery::enableView($view); // равносильно $view->addHelperPath('ZendX/JQuery/View/Helper/', 'ZendX_JQuery_View_Helper');
    	$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
    	$viewRenderer->setView($view);
    	
    	// Return it, so that it can be stored by the bootstrap
        return $view;
    }
    
    
    /**
     * Задаем навигацию для сайта
     */
    protected function _initNavigation()
    {
        /**
         * Задаем контейнер навигации
         */
        // пример использования конфигурационного массива
        //$pages = include 'application/configs/navigation.php';
        // использование конфигурационного ini-файла
        $pages = new Zend_Config_Ini('application/configs/navigation.ini', 'navigation');
        // создаем контейнер навигации
        $container = new Zend_Navigation($pages);
        // заносим контейнер навигации в реестр для последующего использования
        Zend_Registry::set('Zend_Navigation', $container);
    }
     
}
	
